<?php
/**
 * Created by PhpStorm.
 * User: liangtiehui
 * Date: 2016/1/25
 * Time: 17:58
 */

namespace Template;

/**
 * 抽象模版类
 * 定义抽象的行为方法座位顶层逻辑的架子，其他方法及状态由子类实现。
 * Class AbstractTemplate
 * @package Template
 */
abstract class AbstractTemplate
{
    /**
     *  顶层模版方法实现，类似：试题只有一份，里面的内容都可以当作模版来复用
     */
    public function templateMethod()
    {
        $this->addTemplate1();
        $this->repeateTemplate1();
        $this->addTemplate2();
        $this->repeateTemplate2();
    }

    public function addTemplate1()
    {
        echo "this is template one";
    }

    public function addTemplate2()
    {
        echo "this is template two";
    }

    /**
     * 交给各个子类实现其他不同的方法/状态，类似于各个同学都会有不同的试卷答案。
     * @return mixed
     */
    abstract protected function repeateTemplate1();

    abstract protected function repeateTemplate2();
}